//多态的含义：同一操作作用于不同的对象上面，可以产生不同的解释和不同的执行结果。
//换句话说：给不同的对象发送同一个消息的时候，这些对象会根据这个消息分别给出不同的反馈


//不合适的多态
//如果以后增加了一个动物，那就需要修改 makeSound 函数，但是这种修改是有风险的，修改的地方越多，程序出错的可能性越大
//当动物越来越多时，makeSound将变得十分庞大，
var makeSound = function (animal) {
    if(animal instanceof  Duck){
        console.log('嘎嘎嘎');
    }else if(animal instanceof Chicken){
        console.log('咯咯咯');
    }
};
var Duck  = function () {};
var Chicken = function () {};
makeSound(new Duck());
makeSound(new Chicken());

//多态应该是把 "做什么" 和 "谁去做以及怎么做" 分离开来
//也就是将 "不变的事物" 和 "可能改变的事物" 分离开来

var makeSound = function (animal) {
    animal.sound();
};

var Duck = function () {};

Duck.prototype.sound = function () {
    console.log('嘎嘎嘎');
};

var Chicken = function () {};

Chicken.prototype.sound = function () {
    console.log('咯咯咯');
};

var Dog = function () {};

Dog.prototype.sound = function () {
    console.log('汪汪汪');
};


makeSound(new Duck());
makeSound(new Chicken());
makeSound(new Dog());

//不用再去管对象是什么类型，只需要管有没有该行为
//将过程化的条件分支


var googleMap = {
    show:function () {
        console.log('开始渲染谷歌地图');
    }
};

var baiduMap = {
    show:function () {
        console.log('开始渲染百度地图');
    }
}

var renderMap = function (type) {
    if(type=='google'){
        googleMap.show()
    }else if(type=='baidu'){
        baiduMap.show();
    }
};

renderMap('google');
renderMap('baidu');


var renderMap = function (map) {
    if(map.show instanceof  Function){
        map.show()
    }
}

renderMap(googleMap);
renderMap(baiduMap);

var sosoMap = {
    show:function () {
        console.log('开始渲染搜搜地图');
    }
}

renderMap(sosoMap);